import { IEventHandler } from "./IUtils";

/**设计模式接口 */
export default interface IDesignMode {}

/**观察则模式-委托
 * TIPS:
 */
export interface IDelegate {
  /**观察者集合 */
  obersers: Array<IEventHandler>;
  /**添加观察对象 */
  add(oberser: IEventHandler);
  /**移除观察对象 */
  remove(oberser: IEventHandler);
  /**通知所有观察者 */
  notify(params);
}
/**处理者接口 */
export interface IHandler {
  /**
   * 执行处理
   * @param context 处理上下文
   * @returns 是否处理完毕-true为处理完毕
   */
  invoke(context: any): boolean;
}
/**
 * 责任链-接口
 * TIPS:避免请求发送者与多个请求处理者耦合，将所有处理者通过顺序标记成位一条处理链，请求发生时沿链传递，直到有兑现处理后停止。
 */
export interface IResponsibilityChain {
  /**处理者管道 */
  handlerPipeline: Array<IHandler>;
  /**添加处理者 */
  addNext(handler: IHandler);
  /**移除处理者 */
  remove(handler: IHandler);
  /**进入处理管道，处理请求，处理完毕时直接跳出处理链*/
  invoke(context: any);
}
//*******AOP设计模式*******
/**
 * 方法拦截
 */
export interface IAOP {
  /**
   * 函数拦截
   * TIPS:注意作用域需要自己使用bind设置
   * @param orign 原函数
   * @param before 执行前
   * @param after 执行后
   */
  interceptMethod(orign: Function, before: Function, after: Function);
}
